import type { FormRules } from "element-plus";

// 姓名验证规则（只允许中文、英文、空格、连字符和点）
const usernameRules = [
  {
    required: true,
    message: "请输入姓名",
    trigger: "blur"
  },
  {
    min: 2,
    max: 50,
    message: "姓名长度应在2-50个字符之间",
    trigger: "blur"
  },
  {
    pattern: /^[\u4e00-\u9fa5a-zA-Z\s\-\.]+$/,
    message: "姓名只能包含中文、英文、空格、连字符和点",
    trigger: "blur"
  }
];

// 性别验证规则
const genderRules = [
  {
    required: true,
    message: "请选择性别",
    trigger: "change"
  }
];

// 单位验证规则（只允许中文、英文、数字、空格、连字符、括号、&、.和逗号）
const unitRules = [
  {
    required: true,
    message: "请输入单位",
    trigger: "blur"
  },
  {
    min: 2,
    max: 100,
    message: "单位名称长度应在2-100个字符之间",
    trigger: "blur"
  },
  {
    pattern: /^[\u4e00-\u9fa5a-zA-Z0-9\s\-\(\)（）&.,，。]+$/,
    message: "单位名称只能包含中文、英文、数字、空格、连字符、括号、&、.和逗号",
    trigger: "blur"
  }
];

// 职务验证规则（只允许中文、英文、数字、空格、连字符、括号、&、.和逗号）
const jobRules = [
  {
    required: true,
    message: "请输入职务",
    trigger: "blur"
  },
  {
    min: 2,
    max: 50,
    message: "职务名称长度应在2-50个字符之间",
    trigger: "blur"
  },
  {
    pattern: /^[\u4e00-\u9fa5a-zA-Z0-9\s\-\(\)（）&.,，。]+$/,
    message: "职务名称只能包含中文、英文、数字、空格、连字符、括号、&、.和逗号",
    trigger: "blur"
  }
];

// 手机号验证规则（只允许数字和连字符）
const telephoneRules = [
  {
    required: true,
    message: "请输入手机号",
    trigger: "blur"
  },
  {
    pattern: /^[0-9\-]+$/,
    message: "手机号只能包含数字和连字符",
    trigger: "blur"
  },
  {
    min: 11,
    max: 15,
    message: "手机号长度应在11-15位之间",
    trigger: "blur"
  }
];

// 邮箱验证规则（只允许英文、数字、连字符、下划线、@、.）
const emailRules = [
  {
    required: true,
    message: "请输入邮箱",
    trigger: "blur"
  },
  {
    pattern: /^[a-zA-Z0-9\-_@.]+$/,
    message: "邮箱只能包含英文、数字、连字符、下划线、@和点",
    trigger: "blur"
  },
  {
    type: "email",
    message: "请输入正确的邮箱格式",
    trigger: "blur"
  }
];

// 身份证验证规则（只允许数字和字母X）
const idCardRules = [
  {
    required: true,
    message: "请输入身份证号",
    trigger: "blur"
  },
  {
    pattern: /^[0-9Xx]+$/,
    message: "身份证号只能包含数字和字母X",
    trigger: "blur"
  },
  {
    min: 15,
    max: 18,
    message: "身份证号长度应为15-18位",
    trigger: "blur"
  }
];

// 护照号验证规则（只允许英文和数字）
const passportRules = [
  {
    required: false,
    message: "请输入护照号",
    trigger: "blur"
  },
  {
    pattern: /^[a-zA-Z0-9]+$/,
    message: "护照号只能包含英文和数字",
    trigger: "blur"
  },
  {
    min: 6,
    max: 20,
    message: "护照号长度应在6-20位之间",
    trigger: "blur"
  }
];

// 出生日期验证规则
const birthDateRules = [
  {
    required: true,
    message: "请选择出生日期",
    trigger: "change"
  }
];

// 民族验证规则（只允许中文、英文、空格、连字符和括号）
const nationalityRules = [
  {
    required: true,
    message: "请输入民族",
    trigger: "blur"
  },
  {
    min: 2,
    max: 20,
    message: "民族名称长度应在2-20个字符之间",
    trigger: "blur"
  },
  {
    pattern: /^[\u4e00-\u9fa5a-zA-Z\s\-\(\)（）]+$/,
    message: "民族名称只能包含中文、英文、空格、连字符和括号",
    trigger: "blur"
  }
];

// 政治面貌验证规则（只允许中文、英文、空格、连字符和括号）
const politicalStatusRules = [
  {
    required: true,
    message: "请输入政治面貌",
    trigger: "blur"
  },
  {
    min: 2,
    max: 20,
    message: "政治面貌长度应在2-20个字符之间",
    trigger: "blur"
  },
  {
    pattern: /^[\u4e00-\u9fa5a-zA-Z\s\-\(\)（）]+$/,
    message: "政治面貌只能包含中文、英文、空格、连字符和括号",
    trigger: "blur"
  }
];

// 学历验证规则（只允许中文、英文、空格、连字符和括号）
const educationRules = [
  {
    required: true,
    message: "请输入学历",
    trigger: "blur"
  },
  {
    min: 2,
    max: 20,
    message: "学历长度应在2-20个字符之间",
    trigger: "blur"
  },
  {
    pattern: /^[\u4e00-\u9fa5a-zA-Z\s\-\(\)（）]+$/,
    message: "学历只能包含中文、英文、空格、连字符和括号",
    trigger: "blur"
  }
];

// 专业验证规则（只允许中文、英文、数字、空格、连字符、括号、&、.和逗号）
const majorRules = [
  {
    required: true,
    message: "请输入专业",
    trigger: "blur"
  },
  {
    min: 2,
    max: 50,
    message: "专业名称长度应在2-50个字符之间",
    trigger: "blur"
  },
  {
    pattern: /^[\u4e00-\u9fa5a-zA-Z0-9\s\-\(\)（）&.,，。]+$/,
    message: "专业名称只能包含中文、英文、数字、空格、连字符、括号、&、.和逗号",
    trigger: "blur"
  }
];

// 毕业院校验证规则（只允许中文、英文、数字、空格、连字符、括号、&、.和逗号）
const schoolRules = [
  {
    required: true,
    message: "请输入毕业院校",
    trigger: "blur"
  },
  {
    min: 2,
    max: 100,
    message: "毕业院校名称长度应在2-100个字符之间",
    trigger: "blur"
  },
  {
    pattern: /^[\u4e00-\u9fa5a-zA-Z0-9\s\-\(\)（）&.,，。]+$/,
    message: "毕业院校名称只能包含中文、英文、数字、空格、连字符、括号、&、.和逗号",
    trigger: "blur"
  }
];

// 工作年限验证规则（只允许数字）
const workYearsRules = [
  {
    required: true,
    message: "请输入工作年限",
    trigger: "blur"
  },
  {
    pattern: /^[0-9]+$/,
    message: "工作年限只能包含数字",
    trigger: "blur"
  },
  {
    min: 1,
    max: 2,
    message: "工作年限应为1-2位数字",
    trigger: "blur"
  }
];

// 紧急联系人验证规则（只允许中文、英文、空格、连字符和点）
const emergencyContactRules = [
  {
    required: true,
    message: "请输入紧急联系人",
    trigger: "blur"
  },
  {
    min: 2,
    max: 50,
    message: "紧急联系人姓名长度应在2-50个字符之间",
    trigger: "blur"
  },
  {
    pattern: /^[\u4e00-\u9fa5a-zA-Z\s\-\.]+$/,
    message: "紧急联系人姓名只能包含中文、英文、空格、连字符和点",
    trigger: "blur"
  }
];

// 紧急联系人关系验证规则（只允许中文、英文、空格、连字符和括号）
const emergencyRelationRules = [
  {
    required: true,
    message: "请输入紧急联系人关系",
    trigger: "blur"
  },
  {
    min: 2,
    max: 20,
    message: "关系长度应在2-20个字符之间",
    trigger: "blur"
  },
  {
    pattern: /^[\u4e00-\u9fa5a-zA-Z\s\-\(\)（）]+$/,
    message: "关系只能包含中文、英文、空格、连字符和括号",
    trigger: "blur"
  }
];

// 紧急联系人电话验证规则（只允许数字和连字符）
const emergencyPhoneRules = [
  {
    required: true,
    message: "请输入紧急联系人电话",
    trigger: "blur"
  },
  {
    pattern: /^[0-9\-]+$/,
    message: "电话只能包含数字和连字符",
    trigger: "blur"
  },
  {
    min: 11,
    max: 15,
    message: "电话长度应在11-15位之间",
    trigger: "blur"
  }
];

// 现居住地址验证规则（支持中文、英文、数字、空格、标点符号）
const addres1Rules = [
  {
    required: true,
    message: "请输入现居住地址",
    trigger: "blur"
  },
  {
    min: 5,
    max: 200,
    message: "地址长度应在5-200个字符之间",
    trigger: "blur"
  },
  {
    pattern: /^[\u4e00-\u9fa5a-zA-Z0-9\s\-\(\)（）.,，。！？；：""'']+$/,
    message: "地址只能包含中文、英文、数字、空格和常用标点符号",
    trigger: "blur"
  }
];

// 户籍地详址验证规则（支持中文、英文、数字、空格、标点符号）
const addres2Rules = [
  {
    required: true,
    message: "请输入户籍地详址",
    trigger: "blur"
  },
  {
    min: 5,
    max: 200,
    message: "地址长度应在5-200个字符之间",
    trigger: "blur"
  },
  {
    pattern: /^[\u4e00-\u9fa5a-zA-Z0-9\s\-\(\)（）.,，。！？；：""'']+$/,
    message: "地址只能包含中文、英文、数字、空格和常用标点符号",
    trigger: "blur"
  }
];

// 照片验证规则
const photoRules = [
  {
    required: true,
    message: "请上传照片",
    trigger: "change"
  }
];

// 导出验证规则
export const certificateFormRules: FormRules = {
  username: usernameRules,
  gender: genderRules,
  unit: unitRules,
  job: jobRules,
  telephone: telephoneRules,
  email: emailRules,
  id_card: idCardRules,
  addres1: addres1Rules,
  addres2: addres2Rules,
  photo: photoRules
};

// 表单整体验证
export const validateCertificateForm = (form: any) => {
  const errors: string[] = [];

  // 验证必填字段
  if (!form.username?.trim()) {
    errors.push("请输入姓名");
  }

  if (!form.gender) {
    errors.push("请选择性别");
  }

  if (!form.unit?.trim()) {
    errors.push("请输入单位");
  }

  if (!form.job?.trim()) {
    errors.push("请输入职务");
  }

  if (!form.telephone?.trim()) {
    errors.push("请输入手机号");
  }

  if (!form.email?.trim()) {
    errors.push("请输入邮箱");
  }

  if (!form.idCard?.trim()) {
    errors.push("请输入身份证号");
  }

  if (!form.birthDate) {
    errors.push("请选择出生日期");
  }

  if (!form.nationality?.trim()) {
    errors.push("请输入民族");
  }

  if (!form.politicalStatus?.trim()) {
    errors.push("请输入政治面貌");
  }

  if (!form.education?.trim()) {
    errors.push("请输入学历");
  }

  if (!form.major?.trim()) {
    errors.push("请输入专业");
  }

  if (!form.school?.trim()) {
    errors.push("请输入毕业院校");
  }

  if (!form.workYears?.trim()) {
    errors.push("请输入工作年限");
  }

  if (!form.emergencyContact?.trim()) {
    errors.push("请输入紧急联系人");
  }

  if (!form.emergencyRelation?.trim()) {
    errors.push("请输入紧急联系人关系");
  }

  if (!form.emergencyPhone?.trim()) {
    errors.push("请输入紧急联系人电话");
  }

  if (!form.photo?.trim()) {
    errors.push("请上传照片");
  }

  return {
    isValid: errors.length === 0,
    errors
  };
};

// 验证照片文件
export const validatePhotoFile = (file: File) => {
  const errors: string[] = [];

  // 检查文件类型
  const allowedTypes = ['image/jpeg', 'image/jpg', 'image/png'];
  if (!allowedTypes.includes(file.type)) {
    errors.push("照片文件格式必须是JPG、PNG或JPEG");
  }

  // 检查文件大小（500KB）
  const maxSize = 500 * 1024;
  if (file.size > maxSize) {
    errors.push("照片文件大小不能超过500KB");
  }

  // 检查文件名长度
  if (file.name.length > 100) {
    errors.push("照片文件名长度不能超过100个字符");
  }

  return {
    isValid: errors.length === 0,
    errors
  };
};
